iT邦幫忙

2025 iThome 鐵人賽

DAY 23
0
Security

從1到2的召喚羊駝補破網之旅系列 第 23

Day 23 :加密文件到惡意產生

  • 分享至 

  • xImage
  •  

加密

python aes_file_crypto.py enc 1.txt

會輸出 1.txt.enc

解密

python aes_file_crypto.py dec 1.txt.enc

會輸出 1.txt.dec

[鐵人賽] Day 23:AI 一鍵生成 AES 加密程式,與勒索病毒只差一行指令(加強版)

✍️ 寫在前面

今天把教學示範拉回「實務+負責任思考」。
我示範了用 LLM 快速生成一個 AES 檔案加解密工具,並把 GitHub 範例Solomon-77/aes-file-crypto)與 LLM 產出版本 做比較,最後討論可被惡用的風險與藍隊的防護重點。

重點提醒:本文目的是「教育、檢討、與防護」,不是幫助任何人製造或散播惡意軟體。示範程式可用於學習如何正確加密與進行安全設計,切勿在未經授權的情況下對外部系統或他人資料執行加密操作。


🔁 LLM 示範 — Prompt(原始輸入)

這是我丟給 LLM(Ollama / Qwen / ChatGPT 類模型)的 prompt:

請幫我寫一個 Python AES 檔案加解密程式,
支援:
python aes_file.py enc 1.txt
python aes_file.py dec 1.txt.enc
並且使用 SHA256 將輸入密碼雜湊成金鑰。

LLM 迅速回傳了一個可執行的範例(PyCryptodome)。下面把它完整放上,方便做比較與教學。


📜 LLM 生成程式(aes_file.py

import sys
import os
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
from hashlib import sha256

# 將輸入密碼轉成 256-bit 金鑰
def get_key(password):
    return sha256(password.encode()).digest()

def pad(data):
    pad_len = 16 - (len(data) % 16)
    return data + bytes([pad_len]) * pad_len

def unpad(data):
    pad_len = data[-1]
    return data[:-pad_len]

def encrypt_file(filename, password):
    key = get_key(password)
    cipher = AES.new(key, AES.MODE_CBC)
    with open(filename, "rb") as f:
        plaintext = f.read()
    ciphertext = cipher.encrypt(pad(plaintext))
    out_file = filename + ".enc"
    with open(out_file, "wb") as f:
        f.write(cipher.iv)
        f.write(ciphertext)
    print(f"[+] 加密完成: {out_file}")

def decrypt_file(filename, password):
    key = get_key(password)
    with open(filename, "rb") as f:
        iv = f.read(16)
        ciphertext = f.read()
    cipher = AES.new(key, AES.MODE_CBC, iv)
    plaintext = unpad(cipher.decrypt(ciphertext))
    out_file = filename.replace(".enc", "")
    with open(out_file, "wb") as f:
        f.write(plaintext)
    print(f"[+] 解密完成: {out_file}")

if __name__ == "__main__":
    if len(sys.argv) < 3:
        print("用法: python aes_file.py [enc|dec] filename [password]")
        sys.exit(1)

    mode, filename = sys.argv[1], sys.argv[2]
    password = sys.argv[3] if len(sys.argv) == 4 else input("輸入密碼: ")

    if mode == "enc":
        encrypt_file(filename, password)
    elif mode == "dec":
        decrypt_file(filename, password)
    else:
        print("模式錯誤,請用 enc 或 dec")

✅ 執行範例

# 加密
python aes_file.py enc 1.txt MyPassword
# -> 輸出 1.txt.enc

# 解密
python aes_file.py dec 1.txt.enc MyPassword
# -> 輸出 1.txt

教學時可以示範:使用同一密碼加解密成功,改密碼則會失敗(除非密碼雜湊結果相同)。


🔐 教學重點(教育訓練可用)

主題 重點說明
AES 對稱式加密演算法;速度快,常用於檔案與通訊加密。選擇模式(CBC/EAX/GCM)會影響保密性與完整性保障。
SHA-256 雜湊演算法,不可逆;常用來把任意長密碼轉為固定長度金鑰(但需注意 salt/衍生函數以抵抗暴力破解)。
EAX / CBC / GCM EAX / GCM 提供 authenticated encryption(同時提供機密性與完整性);CBC 必須搭配 MAC(如 HMAC)否則易遭改寫攻擊。
密鑰管理 密碼、金鑰不可硬編碼;應使用 KMS、硬體模組或使用者在安全環境輸入並避免寫入磁碟。
完整性 單純的 AES-CBC 沒有內建完整性驗證。實務應用請使用 AEAD(如 AES-GCM / AES-EAX)或加 HMAC 驗證。
部署/使用 在自動化環境避免明碼密碼參數;改用環境變數、受控金鑰存取、或使用 OS keyring。

🔍 與 GitHub 範例(Solomon-77/aes-file-crypto)比較重點

GitHub 範例亮點(原始你給的)

  • 使用 AES EAX 模式(AEAD),內建完整性 tag;能驗證資料未被篡改。
  • 程式結構清楚,適合示範如何寫 nonce/tag/ciphertext 到檔案。
  • 缺點:金鑰硬編碼(示範用),缺乏密鑰管理與使用者互動設計。

LLM 版本亮點

  • 使用 SHA-256 衍生金鑰(更動態,接受使用者密碼)。
  • 支援簡單 CLI 參數(方便教學互動)。
  • 缺點:使用 CBC 而非 AEAD,未包含 HMAC,容易被改寫攻擊或 padding oracle(若不小心實作不當)。

教育角度總結

  • 最理想:把 LLM 的互動性(密碼輸入、CLI)與 GitHub 的 AEAD(EAX/GCM + tag 驗證)結合,並加上安全金鑰管理(環境變數 / KMS)與使用者輸入保護(不在命令列明碼傳遞密碼)。

⚠️ 可被濫用的技術思考(防護角度)

AI 幫你快速產生加密程式是好事,但它也降低了惡意行為的技術門檻。以下是我在課堂上會強調的防護方向(藍隊視角):

  1. 檢測可疑行為

    • 監控大量檔案被打開並寫入 .enc 的模式/短時間內大量 I/O。
    • 建立文件完整性監測(FIM)與備份驗證(確保能快速回滾)。
  2. 控制與限制程式執行權限

    • 最小權限原則:禁止一般用戶執行能寫整個資料夾的腳本。
    • 應用白名單/AppLocker / 防毒升級文件範本辨識。
  3. 金鑰管理與秘密保護

    • 不允許密鑰硬編碼;使用 HSM / KMS 或受控環境變數。
    • 在自動化腳本中避免把密碼放在命令列(因為會被歷史紀錄、process list 紀錄)。
  4. 網路層面防護(避免傳播)

    • 關閉不必要的傳輸協定(SMBv1),打補丁,降低 worm 類惡意程式的擴散風險。
    • 建立網段隔離、EDR 行為偵測、及時回應流程。

🧾 實務建議(改進示例)

若你想把 LLM 版變成「教學且較安全的版本」,可採取以下改進(示意):

  • 使用 AES-GCM 或 AES-EAX(AEAD)以得到完整性驗證(tag)。
  • 使用 getpass.getpass() 或環境變數來安全輸入密碼(不要在 CLI 命令列明碼傳遞)。
  • 以 PBKDF2 / scrypt / Argon2 取代單純 sha256,增加密鑰衍生強度(加 salt 與迭代)。
  • 在檔案格式中寫入 metadata(例如 salt、mode、tag),以便正確解密與檢查。
  • 加入「安全範圍」保護:例如預設只處理當前資料夾指定清單,不遞迴整個磁碟(避免被錯誤/惡意使用)。

⚖️ 道德與法規提醒

  • 在未獲授權的設備或系統上執行加密/測試是違法或違反公司政策的。
  • 使用這類示範程式時,請在 isolated lab(VM / snapshot)環境進行。
  • 若在工作上要做惡意軟體模擬,先取得書面授權(NDA / 测试同意書),並有回滾與通知機制。

🔁 與 WannaCry、SMBv1 的連結(為什麼這件事很重要)

  • WannaCry 利用 SMBv1 的遠端執行漏洞(EternalBlue)來橫向散播並加密檔案。
  • 現在 Windows 10 EOS(或舊系統)仍然存在時,若有未打補丁或未關閉 SMBv1,類似的散播途徑仍有可能被濫用。
  • 在課堂上,示範 LLM 生成的 AES 工具後,接著檢查環境是否還開放 SMBv1(使用 nmap / Windows 指令),是一個很好的「攻防整合」教案。

範例檢查指令(示意):

# Nmap 檢查 SMB protocols
nmap --script smb-protocols -p445 192.168.0.0/24

# Windows 關閉 SMBv1 (PowerShell)
Disable-WindowsOptionalFeature -Online -FeatureName smb1protocol

(上述指令用於審計/防護,請在授權範圍內執行)


🤖 LLM 現場操作 prompt 範例(教學用)

可以在內訓時讓學員實際與 LLM 互動的 prompt:

  1. 產生程式
請寫一個 Python 程式,支援 `python aes_file.py enc filename` 與 `python aes_file.py dec filename`,
使用 SHA256 或 PBKDF2 將密碼衍生成金鑰,並使用 AES-GCM(AEAD)以確保完整性。請把 salt/iv/tag 與 ciphertext 一起寫入輸出檔案的前段。
  1. 安全檢查
以下是一段 AES 加解密程式,請檢查是否有安全風險,列出至少 5 項改進建議,不要提供可直接被濫用的惡意程式碼。
  1. 教案產出
請根據上面程式,設計一個 45 分鐘的實作教學大綱,包括示範步驟、練習題、與防護討論主題。

小結(課堂要帶走的幾句話)

  1. AI 可以把工具快速變成「可執行的現實」,但安全性設計仍是人類的責任。
  2. LLM 生成的程式非常適合做教學素材:讓學員理解加密流程、金鑰管理、以及攻擊/防護的連結。
  3. 把示範鎖在 Lab、不要在生產環境跑不受控的程式;同時檢查網路中老舊協定(如 SMBv1)是否已關閉/補丁。

上一篇
Day 22:官方推薦的提示詞
下一篇
Day 24:紅隊賽前情報蒐集
系列文
從1到2的召喚羊駝補破網之旅24
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言